package com.bonshotels.DomainLayer.Factories;

import com.bonshotels.DomainLayer.ServeiAutoritzacioCredit.IObjectiuServeiAutoritzacioCredit;
import com.bonshotels.DomainLayer.ServeiAutoritzacioCredit.AdaptadorServeiAutoritzacioCredit;

/**
 * Classe FactoriaObjectiuServeiAutoritzacioCredit.
 * 
 * Aquesta classe socupa de crear instancies dels adaptadors que accedeixen al servei
 * de pagament amb tarja. Com que es la factoria qui socupa de crear els adaptadors, 
 * aconseguim un disseny mes canviable. A mes creem objectes que implementen la 
 * interficie ObjectiuServeiAutoritzacioCredit, aixo fa el disseny encara mes
 * canviable ja que si un dia decidim canviar dadaptador nomes haurem de canviar una 
 * linea de codi en aquesta classe, i no caldra anar a buscar en el model de domini 
 * totes les invocacions que es facin al servei de pagament amb tarja. La classe 
 * sha implementat com 'publica' ja que daquesta manera no es podra veure la classe
 * fora del paquet factories i ens interessa poder utilitzarla des de el model de domini. 
 * @author Jordi Sabater
 */
public class FactoriaObjectiuServeiAutoritzacioCredit {

	/** Aquesta classe es singleton i per tant cal emmagatzemar la instancia de la 
	 * classe. La inicialitzem a null ja que al iniciar laplicacio encara no shaura
	 * creat la instancia. */
	private static FactoriaObjectiuServeiAutoritzacioCredit instancia = null;
	
	/**
	 * Obte la unica instancia que permet la classe. Si es el primer cop que sexecuta
	 * caldra crearne una de nova.
	 *
	 * @return La unica instancia que permet la classe.
	 */
	public static FactoriaObjectiuServeiAutoritzacioCredit obteInstancia() {
		if(instancia == null) {
			instancia = new FactoriaObjectiuServeiAutoritzacioCredit();
		}
		return instancia;
	}
	
	/**
	 * Crea una nova instancia de la classe que implementa la interficie 
	 * ObjectiuServeiAutoritzacioCredit. Al utilitzar una interficie (ja que utilitzem
	 * el patro adaptador) i una factoria per accedir al servei de pagament amb tarja,
	 * aconseguim un sistema molt canviable.
	 *
	 * @return Ladaptador del servei que implementa la interficie 
	 * ObjectiuServeiAutoritzacioCredit.
	 */
	public IObjectiuServeiAutoritzacioCredit creaOSAC() {
		return new AdaptadorServeiAutoritzacioCredit();
	}
	
}
